package jp.syuriken.snsw.terenaibot;

import java.util.HashMap;
import java.util.Map;

/**
 * ポストラッパプール
 * 
 * @author $Author: snswinhaiku.lo@gmail.com $
 * @version 0.2
 */
public class PostWrapperPool {
	
	private static Map<String, Class<? extends PostWrapper>> wrapperMap =
			new HashMap<String, Class<? extends PostWrapper>>();
	

	/**
	 * ラッパを追加する
	 * 
	 * @param service サービス名。
	 * @param wrapperClass ラッパークラス。
	 * @return 追加されたかどうか。すでに存在している場合falseが帰ります。
	 */
	public static boolean addWrapper(String service, Class<? extends PostWrapper> wrapperClass) {
		if (wrapperMap.containsKey(service)) {
			return false;
		} else {
			wrapperMap.put(service, wrapperClass);
			return true;
		}
	}
	
	/**
	 * ラッパを取得する
	 * 
	 * @param service サービス名
	 * @param configuration ボットの設定
	 * @return ラッパインスタンス。nullが帰ることもあります
	 * @throws IllegalAccessException インスタンスの作成に失敗
	 * @throws InstantiationException インスタンスの作成に失敗
	 * @throws ConfigurationException 設定値が異常
	 */
	public static PostWrapper getWrapper(String service, BotConfiguration configuration) throws InstantiationException,
			IllegalAccessException, ConfigurationException {
		if (!wrapperMap.containsKey(service)) {
			return null;
		}
		Class<? extends PostWrapper> wrapperClass = wrapperMap.get(service);
		PostWrapper wrapper = wrapperClass.newInstance();
		if (wrapper == null) {
			return null;
		}
		return wrapper.init(configuration);
	}
	
	/**
	 * 指定したラッパを保持しているかどうかを返す。
	 * 
	 * @param service サービス名
	 * @return 保持しているかどうか。
	 */
	public static boolean haveWrapper(String service) {
		return wrapperMap.containsKey(service);
	}
	
	/**
	 * 指定したサービス名の{@link PostWrapper}をプールから削除します。
	 * 
	 * @param service サービス名
	 * @return 保持していた{@link PostWrapper}
	 */
	public static Class<? extends PostWrapper> removeWrapper(String service) {
		if (wrapperMap.containsKey(service)) {
			return null;
		} else {
			return wrapperMap.remove(service);
		}
	}
	
	private PostWrapperPool() {
	}
}
